﻿#pragma once

// 引入必要的头文件和 TapAPI 交易接口头文件
#include <queue>
#include <stdint.h>
#include <thread>
#include <define.h>
#include <log_wapper.hpp>
#include <trader_api.h>
#include <params.hpp>
#include <condition_variable>
#include <../../api/TAP_V9_20200808/TapTradeAPI.h>
#include <dll_helper.hpp>

// tap_api_trader 类
// 继承自 asyn_actual_trader（异步交易员）和 ITapTradeAPINotify（TapAPI 交易 SPI 接口实现类）
class tap_api_trader : public asyn_actual_trader, public ITapTradeAPINotify
{
    // 结构体：order_index
    // 用于存储订单的索引信息
    struct order_index
    {
        TAPICHAR ServerFlag;      // 服务器标识
        TAPISTR_20 OrderNo;       // 委托编码
    };

public:
    // 构造函数：初始化交易 API 对象并加载相关配置
    tap_api_trader(const std::shared_ptr<std::unordered_map<std::string, std::string>>& id_excg_map, const params& config) noexcept;

    // 析构函数：释放交易 API 资源
    virtual ~tap_api_trader() noexcept;

    // trader_api 接口的实现
public:
    virtual bool login() noexcept override;                              // 登录
    virtual void logout() noexcept override;                            // 登出
    virtual bool is_usable() const noexcept override;                   // 检查是否可用
    virtual estid_t place_order(offset_type offset, direction_type direction, const code_t& code, uint32_t count, double_t price, order_flag flag) noexcept override; // 下单
    virtual bool cancel_order(estid_t estid) noexcept override;         // 撤单
    virtual uint32_t get_trading_day() const noexcept override;         // 获取交易日
    virtual std::shared_ptr<trader_data> get_trader_data() noexcept override; // 获取交易数据

    // ITapTradeAPINotify 接口的实现（用于处理来自 TapAPI 的回调通知）
public:
    virtual void TAP_CDECL OnConnect() noexcept;                            // 连接成功回调
    virtual void TAP_CDECL OnRspLogin(TAPIINT32 errorCode, const TapAPITradeLoginRspInfo* loginRspInfo) noexcept; // 登录响应回调
    virtual void TAP_CDECL OnAPIReady() noexcept;                          // API 就绪回调
    virtual void TAP_CDECL OnDisconnect(TAPIINT32 reasonCode) noexcept;    // 断开连接回调
    virtual void TAP_CDECL OnRtnOrder(const TapAPIOrderInfoNotice* info) noexcept; // 订单通知回调
    virtual void TAP_CDECL OnRspOrderAction(TAPIUINT32 sessionID, TAPIUINT32 errorCode, const TapAPIOrderActionRsp* info) noexcept; // 订单操作响应回调
    virtual void TAP_CDECL OnRspQryOrder(TAPIUINT32 sessionID, TAPIINT32 errorCode, TAPIYNFLAG isLast, const TapAPIOrderInfo* info) noexcept; // 查询订单响应回调
    virtual void TAP_CDECL OnRspQryPosition(TAPIUINT32 sessionID, TAPIINT32 errorCode, TAPIYNFLAG isLast, const TapAPIPositionInfo* info) noexcept; // 查询持仓响应回调
    // 其他未实现的回调接口均为空实现或用于扩展其他功能

private:
    // 私有方法：查询持仓和订单
    bool query_positions(bool is_sync) noexcept; // 查询持仓
    bool query_orders(bool is_sync) noexcept;    // 查询订单

    // 内联函数：方向和偏移类型转换
    inline int convert_direction_offset(direction_type dir_type, offset_type offset_type) noexcept; // 方向和偏移类型转换
    inline direction_type wrap_direction_offset(TAPISideType dir_type, TAPIPositionEffectType offset_type) noexcept; // 反向转换方向和偏移类型
    inline int convert_offset_type(const code_t& code, uint32_t volume, offset_type offset, direction_type direction) noexcept; // 偏移类型转换
    inline offset_type wrap_offset_type(const code_t& code, TAPIPositionEffectType offset_type) noexcept; // 反向偏移类型转换

    // 内联函数：生成扩展订单 ID
    inline estid_t generate_estid() noexcept;

protected:
    // 成员变量
    ITapTradeAPI* _td_api;                         // TapAPI 交易 API 指针
    uint32_t _reqid;                               // 请求 ID 计数器

    std::string _ip;                               // 服务器 IP
    uint16_t _port;                                // 服务器端口
    std::string _userid;                           // 用户 ID
    std::string _password;                         // 用户密码
    std::string _appid;                            // 应用 ID
    std::string _authcode;                         // 认证码

    uint32_t _order_ref;                           // 订单引用号
    uint32_t _login_time;                          // 登录时间戳

    std::map<code_t, position_seed> _position_info; // 持仓信息
    entrust_map _order_info;                       // 订单信息
    std::map<estid_t, order_index> _order_index;   // 订单索引

    bool _is_runing;                               // 是否正在运行
    std::mutex _mutex;                             // 互斥锁
    std::unique_lock<std::mutex> _process_mutex;   // 进程互斥锁
    std::condition_variable _process_signal;       // 进程信号量

    bool _is_inited;                               // 是否已初始化
    bool _is_connected;                            // 是否已连接
    std::atomic<bool> _is_sync_wait;               // 是否同步等待
    std::atomic<bool> _is_in_query;                // 是否在查询

    typedef ITapTradeAPI* (*trader_creator)(const TapAPIApplicationInfo* appInfo, TAPIINT32& iResult); // 定义创建函数指针
    trader_creator _tap_creator;                   // 创建 API 函数指针
    typedef void (*trader_destroyer)(ITapTradeAPI*); // 定义销毁函数指针
    trader_destroyer _tap_destroyer;               // 销毁 API 函数指针

    dll_handle _trader_handle;                     // 动态库句柄
    uint32_t _trading_day;                         // 当前交易日
};
